$Description$
给出一个$N$个点$M$条边的无向带权图,以及$Q$个询问,每次询问在图中删掉一条边后图的最小生成树。(各询问间独立,每次询问不对之后的询问产生影响,即被删掉的边在下一条询问中依然存在)
$Solution$
我们先做好图的最小生成树。
如果删除的边不在最小生成树上,那答案就是最小生成树,直接输出即可。
此时要找能够代替删去的边的一条权值最小的边。用这条边代替删去的边后就是新的最小生成树了。
那怎么代替呢?
我们把最小生成树的样子画个图看看
再删去一条边
是不是就变成了两个部分
我们要找的就是所有能使两个连通块连通的非树边。这样的非树边就能够代替删去的边重新使树连通。
那怎么找一条权值最小的边$?$
现在反过来想,一条非树边可以代替哪些边$?$
一条非树边可以代替其两端点在树上的简单路径之间的所有边
画一下图即可,如果删去边不在简单路径上,那么删去边的两端一定在同一个部分(即无法在异侧)
然后对于每条非树边,用它的值去更新它两端点构成的简单路径上的边,用树链剖分优化复杂度
先预处理出最小生成树,然后将这棵最小生成树进行树链剖分,每一条边记录能够代替它的、权值最小的非树边的长度。对于每条非树边,利用树剖更新其两端点在树上的简单路径之间的所有边记录的最小值。查询时直接查询删除的边上存储的最小值即可。
实际代码可以将边的信息存在其儿子节点上,简化代码复杂度
有两种情况要特判$Not connected:$
原图不连通,对于所有询问都输出$Not connected($树链剖分只是维护用其它边替换一条边的情况,如果原图不连通的话,不但生成树会建错,而且替换了边树也不连通$);$
原图连通,但删去这条边后没有边能替它连通两个块,此时树链剖分上询问这条边所得到的值应该是没更新过的初值,即$inf$。因此判断这个询问值如果是$inf$就输出$Not connected$即可。
还有一些细节代码中有注释
$Code$
1 |
|